// 题意：男人八题的。给定一条线上n个石头，要不断合并相邻的石头，
//       得到的分数是每次合并的和，求最小的分数。
//
// 题解：感觉有点神。用的是GarisaWachs算法，这里暴力求解，
//       fhq神牛给出了可行的解释，详见：
//       http://fanhq666.blog.163.com/blog/static/81943426201062865551410/
//       算法证明在
//       《The Art of Computer Programming》第3卷6.2.2节Algorithm G
//       和Lemma W,Lemma X,Lemma Y,Lemma Z。
//       另外也需要思考下非暴力的维护方法。可以O(n*log(n))。
//
//       楼教主给出的证明还有一个圆方贪心，要用到winner tree，还不是很懂。
// flag: -g
// opt: 0
#include <cstdio>
#include <list>

int const inf = 1 << 28;
int n;
std::list<int> stone;
typedef std::list<int>::iterator stone_iter;

stone_iter next(stone_iter it)
{
	return ++it;
}

stone_iter prev(stone_iter it)
{
	return --it;
}

int main()
{
	while (std::scanf("%d", &n) && n) {
		stone.clear();
		stone.push_back(inf);
		stone.push_back(inf);
		for (int i = 0, x; i < n; i++) {
			std::scanf("%d", &x);
			stone.push_back(x);
		}
		stone.push_back(inf);

		int ans = 0;
		stone_iter it = next(stone.begin());
		for (int i = 1; i < n; i++) {
			/*
			cout << "time: " << i << '\n';
			cout << "before:\n";
			for (auto j : stone) cout << j << ' ';
			cout << '\n';
			cout << '\n';
			*/

			while (*it > *(next(next(it)))) ++it;
			int tmp = *it + *(next(it));
			ans += tmp;
			stone_iter tit = prev(it);
			stone.erase(next(it));
			stone.erase(it);
			while (*tit <= tmp) --tit;
			stone.insert(next(tit), tmp);
			it = prev(tit);
			/*
			std::cout << "after:\n";
			for (auto j : stone) std::cout << j << ' ';
			std::cout << '\n';
			std::cout << '\n';
			*/
		}
		std::printf("%d\n", ans);
	}
}

